package panicybxb

import "fmt"

// 测试Painc
func TestPanic() {
	fmt.Println("-------painc之前-------")
	panic("抛出panic~~~~~~~~~~~~") // 抛出Painc异常
	fmt.Println("-------painc之后-------")
}

func TestDefer() {
	// 遇到无法预测的panic时，可以使用defer和recover捕获。
	// 注意:defer用于函数最后执行的内容，和代码写的位置无关
	defer fmt.Println("-------defer-------")
	fmt.Println("---before---") // 注意:不会执行fmt打印,因为碰到panic时,程序会退出，停止执行
	panic("抛出异常~~~")            // 抛出Panic后面的代码不会执行
	fmt.Println("---after---")  // 注意:不会执行fmt打印,因为碰到panic时,程序会退出，停止执行
}

func TestPanicRecover() {
	// 遇到无法预测的panic时，可以使用defer和recover捕获。
	// 注意：defer是最后执行，和代码写的位置无关
	// defer func() { // 定义一个匿名函数
	//	err := recover()
	//	if err != nil {
	//		fmt.Printf("处理panic异常：%v\n", err)
	//
	//	}
	// }() // ():表示调用匿名函数调用

	// 处理panic异常
	defer handlePanic()
	fmt.Println("----start----")
	// 模拟抛出Panic异常
	// var map1 map[string]string
	// map1["username"] = "ybxb"  // 注意:这一行会抛出Panic异常。

	panic("抛出panic异常~~~")
	fmt.Println("----end----") // 注意:不会执行fmt打印,因为碰到panic时,程序会退出，停止执行
	// 注意：即使使用defer和recover函数捕获了异常，发生panic异常后面的代码也不会执行，只是不会让程序退出了。
}

func handlePanic() {
	panic := recover() // recover()函数的作用是专门用于捕获Panic异常
	if panic != nil {
		fmt.Println("处理panic异常:", panic)
		// 打印结果：panic: assignment to entry in nil map
	}
}
